#!/usr/bin/env python
"""
对比当前配置文件中的音色和种子5201生成的音色是否一致
"""
import sys
import torch
from pathlib import Path

project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))

print("=" * 70)
print(" " * 15 + "音色文件对比检查")
print("=" * 70)
print()

# 检查音色文件
speaker_file = project_root / "speakers" / "girl_5201.pt"

if speaker_file.exists():
    print(f"✓ 找到音色文件: {speaker_file}")
    
    # 加载音色文件
    spk_saved = torch.load(speaker_file, weights_only=True)
    print(f"  音色向量形状: {spk_saved.shape}")
    print(f"  音色向量类型: {spk_saved.dtype}")
    print()
    
    # 生成种子5201的音色
    print("正在用种子5201生成新音色...")
    torch.manual_seed(5201)
    import ChatTTS
    chat = ChatTTS.Chat()
    chat.load(source='huggingface', compile=False, device='cpu')
    spk_new = chat.sample_random_speaker()
    
    print(f"  新音色向量形状: {spk_new.shape}")
    print(f"  新音色向量类型: {spk_new.dtype}")
    print()
    
    # 对比两个音色
    difference = torch.abs(spk_saved - spk_new).mean().item()
    print(f"音色差异度: {difference:.6f}")
    
    if difference < 0.001:
        print("✓ 音色文件与种子5201完全一致！")
    elif difference < 0.01:
        print("⚠️ 音色文件与种子5201略有差异（可能是正常的数值误差）")
    else:
        print("✗ 音色文件与种子5201差异较大！")
        print("  建议重新保存音色文件")
        
        # 保存新音色
        response = input("\n是否用种子5201重新生成并保存音色文件？(y/n): ")
        if response.lower() == 'y':
            torch.save(spk_new, speaker_file)
            print(f"✓ 已更新音色文件: {speaker_file}")
        
else:
    print(f"✗ 未找到音色文件: {speaker_file}")
    print("\n需要生成音色文件...")
    
    # 生成并保存
    import ChatTTS
    print("正在加载ChatTTS...")
    chat = ChatTTS.Chat()
    chat.load(source='huggingface', compile=False, device='cpu')
    
    print("正在生成音色...")
    torch.manual_seed(5201)
    spk_new = chat.sample_random_speaker()
    
    # 确保目录存在
    speaker_file.parent.mkdir(parents=True, exist_ok=True)
    
    # 保存
    torch.save(spk_new, speaker_file)
    print(f"✓ 已保存音色文件: {speaker_file}")

print()
print("=" * 70)
